﻿using BarManager.Core.DomainModel;
using BarManager.Core.DomainService;
using BarManager.Core.Entity;
using System;

namespace BarManager.Infrastructure.Data.Repository
{
    public class PromocionRepository : BaseRepository<Promocion>, IPromocionRepository
    {
        private IPromocionDetalleRepository PromocionDetalleRepository { get; set; }
        public PromocionRepository(IObjectContext context, IPromocionDetalleRepository promocionDetalleRepository)
            : base(context)
        {
            this.PromocionDetalleRepository = promocionDetalleRepository;
        }

        public override void Add(Promocion entity)
        {
            //- Add Master
            Promocion cabecera = new Promocion
            {
                Descripcion = entity.Descripcion,
                DescuentoPesos = entity.DescuentoPesos,
                HoraInicio = new DateTime(1900, 1, 1, entity.HoraInicio.Hour, entity.HoraInicio.Minute, 0),
                HoraFin = new DateTime(1900, 1, 1, entity.HoraFin.Hour, entity.HoraFin.Minute, 0),
                Lunes = entity.Lunes,
                Martes = entity.Martes,
                Miercoles = entity.Miercoles,
                Jueves = entity.Jueves,
                Viernes = entity.Viernes,
                Sabado = entity.Sabado,
                Domingo = entity.Domingo
            };
            base.Add(cabecera);

            //- Add Details         
            foreach (var item in entity.PromocionDetalleList)
            {
                PromocionDetalle detalle = new PromocionDetalle
                {
                    Cantidad = item.Cantidad,
                    ProductoId = item.Producto.Id,
                    PromocionId = cabecera.Id,
                    Promocion = cabecera
                };
                PromocionDetalleRepository.Add(detalle);
            }
        }

        public override void Update(Promocion entity)
        {
            //- Quitamos viejos detalles
            var list = PromocionDetalleRepository.Find(x => x.PromocionId == entity.Id);
            foreach (var item in list) PromocionDetalleRepository.Delete(item);

            //- backupeamos detalles y eliminamos relacion en la cabecera
            var detalle = entity.PromocionDetalleList;
            entity.PromocionDetalleList = null;

            //- actualizamos cabecera            
            entity.HoraInicio = entity.HoraInicio = new DateTime(1900, 1, 1, entity.HoraInicio.Hour, entity.HoraInicio.Minute, 0);
            entity.HoraFin = entity.HoraFin = new DateTime(1900, 1, 1, entity.HoraFin.Hour, entity.HoraFin.Minute, 0);
            base.Update(entity);

            //- agregamos nuevos detalle
            foreach (var item in detalle)
            {
                item.Promocion = null;
                item.Producto = null;
                item.PromocionId = entity.Id;
                PromocionDetalleRepository.Add(item);
            }
        }
    }
}
